# coding:utf-8
import json
import requests
import urllib3
from common.excel import excel_operation
from common.md5 import md5
from common.mylog import log
from common.readConfig import read_conf


# 解决在关闭认证（verify=False）情况下，控制台输出InsecureRequestWarning信息
from common.replace import TempData, data_replace

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

class http_request(object):
    """使用session对象发送请求，自动记录cookie信息
    针对测试数据之间无关联的，封装的请求方法
    """

    def __init__(self,excel_name, sheet_name, cp_excel_name=None, cp_sheet_name=None):
        # 初始化一个session请求对象
        self.session = requests.session()
        # 初始化一个excel文件的sheet表单对象
        self.excel = excel_operation(excel_name, sheet_name, cp_excel_name=None, cp_sheet_name=None)
        # self.excel.copy_excel()
        # 通过sheet表单对象，读取表单中的数据
        self.casedatas = self.excel.read_excel_obj()

    def send_requests(self, casedata, url):
        '''封装requests请求'''
        # url = read_conf.get('zhls', 'url') + casedata.interface
        case_name = casedata.case_name
        method = casedata.method
        datatype = casedata.datatype
        test_nub =  casedata.id
        print("\033[1;30;43m ***********正在执行用例：-----  %s  ----**********\033[0m" % test_nub)
        log.debug("*******正在执行用例：-----  %s  ----**********" % test_nub)
        print("\033[1;30;43m 接口请求方式：%s, 请求地址:%s\033[0m" % (method, url))
        log.debug("接口请求方式：%s, 请求地址:%s" % (method, url))
        print("\033[1;30;43m 接口用例标题:%s\033[0m" % (case_name))
        log.debug("接口用例标题:%s" % (case_name))
        headers = casedata.headers
        data = casedata.data

        # 判断请求头是否为空，有则进行请求数据转换和参数替换
        if headers != None:
            headers = data_replace(headers)
            headers = eval(headers)

        # 判断请求体是否为空，有则进行请求数据转换和参数替换
        if data != None:
            data = data_replace(data)
            # 判断是否是登录接口，从配置文件读取常用登录账号，并在测试数据中替换
            if  "login"  in casedata.interface:
                data = data.replace("*username*",read_conf.get("account","username"))
            data = eval(data)



        # 判断接口是否需要进行md5加密
        if casedata.md5 == "md5":
            (sign, json_str) = md5(data, "mtmy")
            data = {'sign': sign, 'jsonStr': json_str}
        else:
            data = data


        # 将传入的method值强制转换为小写
        method = method.lower()

        if method == 'get':
            print(f"\033[1;30;43m 接口请求的参数---{data}\033[0m\n")
            log.debug(f"接口请求的参数--{data}")
            return self.session.get(url=url, params=data, headers=headers, verify=False)
        elif method == 'post':
            # 判断请求数据是否是json格式
            print(f"\033[1;30;43m 接口请求的参数---{data}\033[0m\n")
            log.debug(f"接口请求的参数--{data}")
            if datatype == "application/json":
                return self.session.post(url=url, json=data, headers=headers, verify=False)
            else:
                return self.session.post(url=url, data=data, headers=headers, verify=False)
        elif method == 'put':
            # 判断请求数据是否是json格式
            print(f"\033[1;30;43m 接口请求的参数---{data}\033[0m\n")
            log.debug(f"接口请求的参数--{data}")
            # if datatype == "application/json":
            return self.session.put(url=url, json=data, headers=headers, verify=False)

    def close(self):
        # 关闭session会话释放空间
        self.session.close()


class HttpParam(object):
    """使用session对象发送请求，自动记录cookie信息
    对于测试用例之间有参数关联的，可以自定义参数
    """

    def __init__(self):
        # 初始化一个session请求对象
        self.session = requests.session()

    def send_request(self,method,url,data,datatype,headers=None):
        print("\033[1;30;43m 接口请求方式：%s, 请求地址:%s\033[0m" % (method, url))
        log.debug("接口请求方式：%s, 请求地址:%s" % (method, url))
        # 将传入的method值强制转换为小写
        method = method.lower()
        # 判断请求方法
        if method == 'get':
            print(f"\033[1;30;43m 接口请求的参数---{data}\033[0m\n")
            log.debug(f"接口请求的参数---{data}")
            return self.session.get(url=url, params=data, headers=headers, verify=False)
        elif method == 'post':
            # 判断请求数据是否是json格式
            print(f"\033[1;30;43m 接口请求的参数---{data}\033[0m\n")
            log.debug(f"接口请求的参数---{data}")
            if datatype == "application/json":
                return self.session.post(url=url, json=data, headers=headers, verify=False)
            else:
                return self.session.post(url=url, data=data, headers=headers, verify=False)

    def close(self):
        # 关闭session会话释放空间
        self.session.close()